<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function gretting(...args){ // rest运算符
            console.log(args,arguments[0],arguments[1]);
            console.log([...arguments],Array.from(arguments)); // 展开运算符
            return `hello,I am ${this.name}`;
        }

        // ...args rest运算符
        Function.prototype.myCall = function(context,...args){
            if(context === null || context === undefined){
                context = window;
            }
            // this? gretting
            //  console.log(this);
            if(typeof this !== 'function'){
                throw new TypeError('type error');
            }
            // 函数要运行
            // es6 新数据类型 唯一绝对不会重复
            const fnKey = Symbol('fn');
            // this 运行 内部this->context
            // this 是 context 上面的方法的时候
            // 不要覆盖 context 上面的属性
            context[fnKey] = this;
            // console.log(context); 
            // 收集参数
            // js对象的动态性
            const result = context[fnKey](...args);
            // context 被污染了 删除属性
            delete context[fnKey];
            return result;
        }
        var obj = {
            name: 'fog',
            fn: function() {

            }
        }
        // 对象的方法调用
        console.log(gretting.myCall(obj,1,2,3));
    </script>
</body>
</html>